﻿// @include "Type.js"
/**
 * @fileOverview 基础扩展类
 * 
 * @version qinglan_Array 1.0
 * @static
 * @author wxq wxqqh@qq.com
 */
/**
 * 命名空间
 * 
 * @namespace
 * @type Object
 */
window.qinglan = window.qinglan || {};
/**
 * 数组工具命名空间
 * 
 * @namespace
 * @type Object
 */
qinglan.Array = qinglan.Array || {};
/**
 * 遍历数组的方法
 * 
 * @param {Array}
 *            array 数组
 * @param {Function}
 *            fun 对每个元素执行的方法,将会把当前处理到的元素作为参数传给这个function
 * @param {Object}
 *            context 方法的上下文
 */
qinglan.Array.each = function(array, fun, context) {
	if (qinglan.Type.isArray(array)) {
		for (var i = 0, len = array.length; i < len; i++) {
			if(fun.call(context, array[i], i, array) === false){break;};
		}
	}
};
/**
 * 判断数组是否有某个元素
 * 
 * @param {Array}
 *            array 数组
 * @param {Object}
 *            item 需要检查的对象
 */
qinglan.Array.has = function(array, item) {
	for (var i = 0, len = array.length; i < len; i++) {
		if (array[i] == item)
			return true;
	}
	return false;
};
/**
 * 从数组里面移除某个元素,如果有重复的话,会全部移除
 * 
 * @param {Array}
 *            array 数组
 * @param {Object}
 *            item 需要移除的对象
 */
qinglan.Array.remove = function(array, item) {
	var j = array.length;
	for (var i = 0; i < j; i++) {
		if (array[i] == item) {
			array.splice(i, 1);
			j--;
		}
	}
};
/**
 * 获取数组最大值或最小值
 * 
 * @param {Array}
 *            array 数组 PS:需要是能转换为比较大小的数组
 * @param {String}
 *            type 获取值的方式,最大为max,最小为min
 */
qinglan.Array.getExtreme = function(array, type) {
	var result = 0;
	for (var i = 0, j = this.length; i < j; i++) {
		(type == 'max' || type == 1) ? (array[i] * 1 > result)
				&& (result = array[i] * 1) : (array[i] * 1 < result)
				&& (result = array[i] * 1);
	}
	return result;
};

/**
 * 将两个元素交换
 * 
 * @param {Array}{Object}
 *            array 数组
 * @param {Number}{String}
 *            first 第一个下标
 * @param {Number}{String}
 *            second 第二个下标
 * @return {Object}{Array} 交换后的数组
 */
qinglan.Array.swap = function(array, first, second) {
	var temp = array[first];
	array[first] = array[second];
	array[second] = temp;
	return array;
};
/**
 * 将数组打乱,原理是随机交换两个元素的值,可以设定洗牌次数
 * 
 * 
 * @param {Array}
 *            array 数组
 * @param {number}
 *            times 洗牌次数,如果不存在就按数组长度计算
 */
qinglan.Array.random = function(array, times) {
	var len = array.length, index_1, index_2;
	times = times || len;
	for (var i = 0; i < times; i++) {
		index_1 = Math.floor(Math.random() * len);
		while ((index_2 = Math.floor(Math.random() * len)) == index_1) {
			continue;
		}
		qinglan.Array.swap(array, index_1, index_2);
	}
	return array;
};
/**
 * 从数组里面计算有多少个指定的对象
 * 
 * @param {Array}
 *            array 数组
 * @param {Object}
 *            item 需要计算的对象
 * @return {Number} 计算值
 */
qinglan.Array.count = function(array, item) {
	var count = 0;
	for (var i = 0, len = array.length; i < len; i++) {
		if (array[i] == item) {
			count++;
		}
	};
	return count;
};
/**
 * 得到数组最后一个元素
 * 
 * @param {Array}
 *            array 数组
 * @return {Object} array数组最后一个元素
 */
qinglan.Array.getTheLast = function(array) {
	return array[array.length - 1];
};